1 /****************************** Module Header ******************************\
2 * Module Name: HookDll.cpp
4 * Copyright (c) Microsoft Corporation.
6 * Defines the exported hook procedure.
8 * This source is subject to the Microsoft Public License.
9 * See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL.
10 * All other rights reserved.
13 * * 5/01/2009 11:04 PM RongChun Zhang Created
14 \***************************************************************************/
19 #define HOOKDLL_EXPORTS
23 // Shared data among all instances.
24 #pragma data_seg(".HOOKDATA")
25 HWND g_hWnd
= NULL
; // Window handle
26 HHOOK g_hHook
= NULL
; // Hook handle
28 // Get module from address
29 HMODULE WINAPI
ModuleFromAddress(PVOID pv
)
31 MEMORY_BASIC_INFORMATION mbi
;
32 if (::VirtualQuery(pv
, &mbi
, sizeof(mbi
)) != 0)
34 return (HMODULE
)mbi
.AllocationBase
;
43 LRESULT CALLBACK
KeyboardHookProc(int nCode
, WPARAM wParam
, LPARAM lParam
)
45 if (nCode
< 0 || nCode
== HC_NOREMOVE
)
46 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
48 if (lParam
& 0x40000000) // Check the previous key state
50 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
53 // Post private messages to Main window
54 // wParam specifies the virtual key code
55 // lParam specifies the key data
56 ::PostMessage(g_hWnd
, WM_KEYSTROKE
, wParam
, lParam
);
58 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
61 // Install or uninstall the hook
62 BOOL WINAPI
SetKeyboardHook(BOOL bInstall
, DWORD dwThreadId
, HWND hWndCaller
)
69 g_hHook
= ::SetWindowsHookEx(WH_KEYBOARD
, KeyboardHookProc
,
70 ModuleFromAddress(KeyboardHookProc
), dwThreadId
);
71 bOk
= (g_hHook
!= NULL
);
75 bOk
= ::UnhookWindowsHookEx(g_hHook
);
84 LRESULT CALLBACK
LowKeyboardHookProc(int nCode
, WPARAM wParam
, LPARAM lParam
)
86 if (nCode
< 0 || nCode
== HC_NOREMOVE
)
87 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
89 if (lParam
& 0x40000000) // Check the previous key state
91 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
94 KBDLLHOOKSTRUCT
*pkbhs
= (KBDLLHOOKSTRUCT
*)lParam
;
96 //check that the message is from keyboard or is synthesized by SendInput API
97 if((pkbhs
->flags
& LLKHF_INJECTED
))
98 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
100 if(wParam
== WM_KEYDOWN
)
102 // Post private messages to Main window
103 // wParam specifies the virtual key code
104 // lParam specifies the scan code
105 ::PostMessage(g_hWnd
, WM_KEYINPUT
, pkbhs
->vkCode
, pkbhs
->scanCode
);
108 return ::CallNextHookEx(g_hHook
, nCode
, wParam
, lParam
);
111 BOOL WINAPI
SetLowKeyboardHook(BOOL bInstall
, DWORD dwThreadId
, HWND hWndCaller
)
118 g_hHook
= ::SetWindowsHookEx(WH_KEYBOARD_LL
, LowKeyboardHookProc
,
119 ModuleFromAddress(LowKeyboardHookProc
), dwThreadId
);
120 bOk
= (g_hHook
!= NULL
);
124 bOk
= ::UnhookWindowsHookEx(g_hHook
);